/**
 * @author 2404559603@qq.com
 * @time 2022-04-18 17:40 PM
 * @description 对axios进行封装
 */
import axios from 'axios'
import store from '../store'

/**
 * 可以通过创建axios实例对象，来进行通用数据封装
 * AxiosStatic.create(config?: AxiosRequestConfig<any>): AxiosInstance
 * create方法接收一个config对象，然后返回一个Axios实例
 */
const Axios = axios.create({
    baseURL: '/api'
})

/**
 * 拦截分为请求前拦截和请求后拦截
 * 请求前的拦截，需要一个函数：(value: AxiosRequestConfig) => AxiosRequestConfig
 * 会由一个形参进来，然后要求返回这个对象
 */
Axios.interceptors.request.use(config => {
    let token = store.getters['common/token'] || ''
    
    /**
     * 做数据接口权限拦截，不是所有的接口都要做拦截
     * 因为某些接口不可能有token，因为还没有登录
     * 1. 判断是否需要权限拦截
     * 2. 判断是否有权限
     */
    let _urls = ['/get/code','/login/byphone','/upload/complate','/register'] // 用于跳过token验证登录的路由
    if (_urls.includes(config.url)) return config

    /** 返回错误信息 */
    if (!token) return Promise.reject({code: 400, message: '被路由拦截下来了，因为需要token验证登录'})

    config.headers.token = token
    return config
})

// (value: AxiosResponse) => AxiosResponse
// Axios.interceptors.response.use(response => {
//     /**
//      * 判断是否是通用错误，如：400
//      */
//     let { data } = response
//     if (data.code === 400) {
//         alert(data.message)
//         return Promise.reject(data)
//     }

//     return response
// })

export default function(_request) {
    // Axios.request(config: AxiosRequestConfig): Promise
    return new Promise(resolve => {
        Axios.request({
            url: _request.url, // 地址
            method: _request.method || 'get', // 方法
            data: _request.data || {},  // 用于除了get的方式
            params: _request.params || {}  // 用于get请求的传参方式
        }).then(({ data }) => {
            // console.log(data)
            resolve(data)
        }).catch(e => {
            console.log(e)
            resolve({code: 400, message: '接口调用失败'})
        })
    })
}